package com.nnnu.wsnackshop.service;

import com.nnnu.wsnackshop.pojo.dto.DeliveryDTO;
import com.nnnu.wsnackshop.pojo.dto.OrderCreateDTO;
import com.nnnu.wsnackshop.pojo.dto.OrderPageQueryDTO;
import com.nnnu.wsnackshop.pojo.entity.Orders;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nnnu.wsnackshop.pojo.vo.LogisticsTrackVO;
import com.nnnu.wsnackshop.pojo.vo.OrderPreviewVO;
import com.nnnu.wsnackshop.pojo.vo.OrderVO;
import com.nnnu.wsnackshop.result.PageResult;
import org.jetbrains.annotations.NotNull;

import java.util.Map;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author zk
 * @since 2025-05-14
 */
public interface IOrdersService extends IService<Orders> {

    /**
     * 从购物车创建订单预览
     * 
     * @param userId      用户ID
     * @param cartItemIds 购物车商品ID字符串，多个ID用逗号分隔
     * @return 订单预览VO
     */
    OrderPreviewVO previewOrderFromCartItems(Integer userId, String cartItemIds);

    /**
     * 从商品直接创建订单预览
     * 
     * @param userId    用户ID
     * @param productId 商品ID
     * @param skuId     规格ID
     * @param quantity  数量
     * @return 订单预览VO
     */
    OrderPreviewVO previewOrderFromProduct(Integer userId, Integer productId, Integer skuId, Integer quantity);

    /**
     * 创建订单
     * 
     * @param userId         用户ID
     * @param orderCreateDTO 创建订单DTO
     * @return 订单VO
     */
    OrderVO createOrder(Integer userId, @NotNull OrderCreateDTO orderCreateDTO);

    /**
     * 获取用户订单分页列表
     * 
     * @param userId   用户ID
     * @param queryDTO 查询参数
     * @return 订单分页结果
     */
    PageResult<OrderVO> getOrdersByUserId(Integer userId, OrderPageQueryDTO queryDTO);

    /**
     * 获取订单详情
     * 
     * @param userId  用户ID
     * @param orderId 订单ID
     * @return 订单VO
     */
    OrderVO getOrderDetail(Integer userId, Long orderId);

    /**
     * 取消订单
     * 
     * @param userId  用户ID
     * @param orderId 订单ID
     * @param reason  取消原因
     * @return 是否成功
     */
    boolean cancelOrder(Integer userId, Integer orderId, String reason);

    /**
     * 确认收货
     * 
     * @param userId  用户ID
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean completeOrder(Integer userId, Integer orderId);

    /**
     * 删除订单（逻辑删除）
     * 
     * @param userId  用户ID
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean deleteOrder(Integer userId, Integer orderId);

    /**
     * 支付订单
     * 
     * @param userId        用户ID
     * @param orderId       订单ID
     * @param paymentMethod 支付方式
     * @return 是否成功
     */
    boolean payOrder(Integer userId, Integer orderId, String paymentMethod);

    /**
     * 获取订单物流信息
     * 
     * @param userId  用户ID
     * @param orderId 订单ID
     * @return 物流轨迹VO
     */
    LogisticsTrackVO getOrderLogistics(Integer userId, Integer orderId);

    /**
     * 检查商品SKU库存（用于调试）
     * 
     * @param skuId SKU ID
     * @return 库存信息
     */
    Map<String, Object> checkSkuStock(Integer skuId);

    /**
     * 获取管理员订单分页列表
     * 
     * @param queryDTO 查询参数
     * @return 订单分页结果
     */
    PageResult<OrderVO> getOrdersForAdmin(OrderPageQueryDTO queryDTO);

    /**
     * 自动分配骑手并更新订单状态
     * 用于同城配送订单在支付后自动分配骑手
     *
     * @param orderId 订单ID
     * @return 骑手ID，如果没有可用骑手返回null
     */
    Integer autoAssignRider(Long orderId);

    /**
     * 用户确认自提
     * 用于自提订单，用户到店取货后确认收货
     *
     * @param userId  用户ID
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean confirmSelfPickup(Integer userId, Long orderId);

    /**
     * 商家确认自提单准备完成
     * 用于自提订单，商家确认订单已准备好，等待用户取货
     *
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean confirmReadyForPickup(Long orderId);

    /**
     * 商家确认同城配送订单准备完成
     * 用于同城配送订单，商家确认订单已准备好，可以进行分配骑手
     *
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean confirmLocalOrderReady(Long orderId);

    /**
     * 获取骑手位置信息
     * 
     * @param orderId 订单ID
     * @return 骑手位置信息
     */
    Map<String, Object> getRiderLocationByOrderId(Long orderId);

    /**
     * 获取订单配送信息
     * 
     * @param orderId 订单ID
     * @return 配送详情
     */
    Map<String, Object> getDeliveryInfoByOrderId(Long orderId);

    /**
     * 再次购买
     * 将订单中的商品添加到购物车中
     *
     * @param userId  用户ID
     * @param orderId 订单ID
     * @return 成功添加到购物车的商品数量
     */
    int buyAgain(Integer userId, Long orderId);
}
